#!/usr/bin/env python
# coding: utf-8

# In[1]:


#用随机森林、0和均值填补缺失值，对比他们的效果
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd 
from sklearn.model_selection import cross_val_score
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor

data_init=pd.read_csv(r'C:\Users\Lenovo\Desktop\机器学习数据\JUTTA DATA\合并数据.csv')
data_init


# In[10]:


#划分特征矩阵和标签
X1=data_init.loc[:,data_init.columns!='TUKI_DATA']
X2=data_init.loc[:,data_init.columns!='LUKU_DATA']
y1=data_init.loc[:,data_init.columns=='TUKI_DATA']
y2=data_init.loc[:,data_init.columns=='LUKU_DATA']
y1=np.array(y1).ravel()
y2=np.array(y2).ravel()
y1


# In[13]:


X1_missing_reg=X1.copy()


# In[14]:


X1_missing_reg.isnull().sum()   #每列特征缺失值的个数


# In[16]:


np.argsort(X1_missing_reg.isnull().sum())  #从小到大排序缺失值的个数对应的列的索引


# In[18]:


index_sort=np.argsort(X1_missing_reg.isnull().sum())[1:].values   #保存数据集中缺失值从小到大排列的特征们的顺序(去除hnro)
index_sort


# In[ ]:


for i in index_sort:
    df=X1_missing_reg
    fill=df.iloc[:,i]  #需要填补缺失值的新标签
    df=pd.concat([pd.DataFrame(y1),df.iloc[:,df.columns!=i]],axis=1)  #新特征矩阵，用concat函数连接没有选中的特征和原标签
    
    #用0填充新特征矩阵中的缺失值
    df_0=SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df)
    
    #划分训练集测试集
    Ytrain=fill[fill.notnull()]
    Ytest=fill[fill.isnull()]
    Xtrain=df_0[Ytrain.index,:]
    Xtest=df_0[Ytest.index,:]
    
    #实例化模型、调用接口
    rfc=RandomForestRegressor(n_estimators=100).fit(Xtrain,Ytrain)
    Ypredict=rfc.predict(Xtest)
    
    #将预测好的新标签填充到原来的特征矩阵中
    X1_missing_reg.iloc[X1_missing_reg.iloc[:,i].isnull(),i]=Ypredict


# In[17]:


X1_missing_reg


# In[54]:


X1_missing_reg.isnull().sum()


# In[50]:


#对所有数据进行建模，取得MSE结果
l=[X1,X1_missing_reg]
MSE=[]
for x in l:
    rfc=RandomForestRegressor(n_estimators=200,random_state=0)
    score=cross_val_score(rfc,x,y1,scoring='neg_mean_squared_error',cv=5).mean()
    MSE.append(score*(-1))


# In[ ]:




